package com.pai4j.zwiki.service.template;

import com.pai4j.zwiki.domain.entity.DetailedAnalysisReportEntity;
import com.pai4j.zwiki.service.LLMService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * 智能论文填充服务
 * 使用 LLM 智能分析模板需求，生成对应的内容并智能插入图表
 *
 * @author pai4j
 * @since 2025-10-12
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class IntelligentThesisFillerService {

    private final LLMService llmService;
    private final ThesisDiagramManager diagramManager;

    /**
     * 智能填充模板内容
     * 让 LLM 根据模板的上下文和项目分析结果，生成最合适的内容
     *
     * @param placeholder 占位符
     * @param context 上下文（前后文）
     * @param analysisReport 项目分析报告
     * @return 填充的内容
     */
    public String intelligentFillContent(
            String placeholder,
            String context,
            DetailedAnalysisReportEntity analysisReport) {
        
        log.info("智能填充占位符: {}", placeholder);

        try {
            // 构建智能填充提示词
            String prompt = buildIntelligentFillPrompt(placeholder, context, analysisReport);
            
            // 调用 LLM 生成内容
            String generatedContent = llmService.generateCodeSummary(prompt);
            
            log.info("内容生成完成，长度: {} 字", generatedContent.length());
            return generatedContent;

        } catch (Exception e) {
            log.error("智能填充失败: {}", placeholder, e);
            return "[内容生成失败]";
        }
    }

    /**
     * 智能决定图表插入位置
     * 让 LLM 分析文本内容，判断在哪些位置插入什么图表最合适
     *
     * @param chapterContent 章节内容
     * @param availableDiagrams 可用的图表
     * @return 图表插入建议
     */
    public List<Map<String, Object>> suggestDiagramInsertion(
            String chapterContent,
            Map<String, String> availableDiagrams) {
        
        log.info("分析图表插入位置");

        List<Map<String, Object>> suggestions = new ArrayList<>();

        try {
            String prompt = buildDiagramInsertionPrompt(chapterContent, availableDiagrams);
            String llmSuggestion = llmService.generateCodeSummary(prompt);

            // 解析 LLM 的建议（简化处理）
            suggestions = parseDiagramSuggestions(llmSuggestion, availableDiagrams);

        } catch (Exception e) {
            log.error("分析图表插入失败", e);
        }

        return suggestions;
    }

    /**
     * 根据章节智能生成内容
     *
     * @param chapterName 章节名称
     * @param chapterContext 章节上下文
     * @param analysisReport 分析报告
     * @return 章节内容
     */
    public String generateChapterContent(
            String chapterName,
            String chapterContext,
            DetailedAnalysisReportEntity analysisReport) {
        
        log.info("智能生成章节内容: {}", chapterName);

        try {
            String prompt = buildChapterGenerationPrompt(chapterName, chapterContext, analysisReport);
            return llmService.generateCodeSummary(prompt);

        } catch (Exception e) {
            log.error("生成章节内容失败: {}", chapterName, e);
            return "";
        }
    }

    /**
     * 智能优化已生成的内容
     * 根据用户反馈改进内容
     *
     * @param originalContent 原始内容
     * @param userFeedback 用户反馈
     * @param analysisReport 分析报告
     * @return 优化后的内容
     */
    public String optimizeContentBasedOnFeedback(
            String originalContent,
            String userFeedback,
            DetailedAnalysisReportEntity analysisReport) {
        
        log.info("根据用户反馈优化内容, 反馈: {}", userFeedback);

        try {
            String prompt = buildOptimizationPrompt(originalContent, userFeedback, analysisReport);
            return llmService.generateCodeSummary(prompt);

        } catch (Exception e) {
            log.error("优化内容失败", e);
            return originalContent;
        }
    }

    // ========== 提示词构建方法 ==========

    /**
     * 构建智能填充提示词
     */
    private String buildIntelligentFillPrompt(
            String placeholder,
            String context,
            DetailedAnalysisReportEntity report) {
        
        return String.format("""
                你正在帮助填充一篇毕业论文模板。
                
                ## 当前位置
                占位符：%s
                上下文：
                %s
                
                ## 项目分析信息
                项目概览：%s
                
                核心模块：%s
                
                技术栈：%s
                
                ## 任务
                请根据以上信息，为占位符生成合适的内容。要求：
                1. 内容要与项目实际情况相符
                2. 语言要专业、学术化
                3. 结构要清晰、有逻辑
                4. 长度要适中（200-500字）
                5. 要自然地承接上下文
                
                请直接输出填充内容，不要额外说明。
                """,
                placeholder,
                truncate(context, 500),
                truncate(report.getProjectOverview(), 300),
                truncate(report.getCoreModulesAnalysis(), 300),
                truncate(report.getTechStack(), 200)
        );
    }

    /**
     * 构建图表插入建议提示词
     */
    private String buildDiagramInsertionPrompt(
            String chapterContent,
            Map<String, String> availableDiagrams) {
        
        StringBuilder diagramList = new StringBuilder();
        availableDiagrams.forEach((name, path) -> 
            diagramList.append("- ").append(name).append("\n")
        );

        return String.format("""
                你正在帮助决定在毕业论文的哪些位置插入架构图表。
                
                ## 当前章节内容
                %s
                
                ## 可用的图表
                %s
                
                ## 任务
                请分析章节内容，建议在哪些段落后插入哪些图表。
                
                回答格式（每行一个建议）：
                [段落关键词] -> [图表名称] -> [插入原因]
                
                示例：
                系统架构设计 -> layerArchitecture -> 展示分层架构
                核心模块 -> detailedClassDiagram -> 展示类之间的关系
                
                请给出3-5个建议。
                """,
                truncate(chapterContent, 1000),
                diagramList.toString()
        );
    }

    /**
     * 构建章节生成提示词
     */
    private String buildChapterGenerationPrompt(
            String chapterName,
            String chapterContext,
            DetailedAnalysisReportEntity report) {
        
        return String.format("""
                请为毕业论文生成"%s"章节的内容。
                
                ## 章节要求
                %s
                
                ## 项目信息
                综合报告：
                %s
                
                深度阅读报告摘要：
                %s
                
                ## 要求
                1. 内容要详实、专业
                2. 结构要清晰、有层次
                3. 语言要学术化
                4. 长度：800-1500字
                5. 要体现项目的实际情况和技术特点
                
                请生成章节内容（只输出正文，不要章节标题）。
                """,
                chapterName,
                chapterContext,
                truncate(report.getComprehensiveReport(), 800),
                truncate(report.getDeepReadingReport(), 500)
        );
    }

    /**
     * 构建内容优化提示词
     */
    private String buildOptimizationPrompt(
            String originalContent,
            String userFeedback,
            DetailedAnalysisReportEntity report) {
        
        return String.format("""
                请优化以下论文内容。
                
                ## 原始内容
                %s
                
                ## 用户反馈
                %s
                
                ## 参考信息
                项目分析：
                %s
                
                ## 优化要求
                1. 根据用户反馈进行针对性改进
                2. 如果用户指出"不详细"，需要补充更多细节
                3. 如果用户指出"模糊"，需要更具体、更清晰
                4. 如果用户指出"不对"，需要基于项目实际情况修正
                5. 保持学术化的语言风格
                6. 确保逻辑连贯、结构清晰
                
                请输出优化后的完整内容。
                """,
                truncate(originalContent, 1500),
                userFeedback,
                truncate(report.getComprehensiveReport(), 500)
        );
    }

    /**
     * 解析图表插入建议
     */
    private List<Map<String, Object>> parseDiagramSuggestions(
            String llmSuggestion,
            Map<String, String> availableDiagrams) {
        
        List<Map<String, Object>> suggestions = new ArrayList<>();

        String[] lines = llmSuggestion.split("\n");
        for (String line : lines) {
            if (line.contains("->")) {
                String[] parts = line.split("->");
                if (parts.length >= 3) {
                    Map<String, Object> suggestion = new HashMap<>();
                    suggestion.put("afterKeyword", parts[0].trim());
                    suggestion.put("diagramName", parts[1].trim());
                    suggestion.put("reason", parts[2].trim());
                    suggestions.add(suggestion);
                }
            }
        }

        return suggestions;
    }

    private String truncate(String text, int maxLength) {
        if (text == null) return "";
        if (text.length() <= maxLength) return text;
        return text.substring(0, maxLength) + "...";
    }

    /**
     * 智能填充论文并插入图表
     * 整合内容生成和图表插入功能
     *
     * @param thesisContent 论文内容
     * @param availableDiagrams 可用图表
     * @param analysisReport 分析报告
     * @return 填充并插入图表后的论文内容
     */
    public String fillThesisWithDiagrams(
            String thesisContent,
            Map<String, String> availableDiagrams,
            DetailedAnalysisReportEntity analysisReport) {
        
        log.info("开始智能填充论文并插入图表");

        // 1. 智能插入图表
        String contentWithDiagrams = diagramManager.intelligentlyInsertDiagrams(
                thesisContent, 
                availableDiagrams
        );

        log.info("论文填充和图表插入完成");
        return contentWithDiagrams;
    }

    /**
     * 为章节推荐合适的图表
     *
     * @param chapterTitle 章节标题
     * @param chapterContent 章节内容
     * @param availableDiagrams 可用图表
     * @return 推荐的图表列表
     */
    public List<String> recommendDiagramsForChapter(
            String chapterTitle,
            String chapterContent,
            Map<String, String> availableDiagrams) {
        
        log.info("为章节推荐图表: {}", chapterTitle);

        List<String> recommendations = new ArrayList<>();

        // 使用图表管理器生成建议
        List<ThesisDiagramManager.DiagramSuggestion> suggestions = 
                diagramManager.generateInsertionSuggestions(chapterContent, availableDiagrams);

        // 选择置信度高的建议
        for (ThesisDiagramManager.DiagramSuggestion suggestion : suggestions) {
            if (suggestion.getConfidence() > 0.5) {
                recommendations.add(suggestion.getDiagramType());
            }
        }

        log.info("为章节 {} 推荐了 {} 个图表", chapterTitle, recommendations.size());
        return recommendations;
    }

    /**
     * 生成图表说明文字
     * 使用LLM为图表生成专业的说明文字
     *
     * @param diagramType 图表类型
     * @param diagramPath 图表路径
     * @param context 上下文
     * @param analysisReport 分析报告
     * @return 图表说明文字
     */
    public String generateDiagramDescription(
            String diagramType,
            String diagramPath,
            String context,
            DetailedAnalysisReportEntity analysisReport) {
        
        log.info("生成图表说明: {}", diagramType);

        try {
            String prompt = buildDiagramDescriptionPrompt(diagramType, context, analysisReport);
            return llmService.generateCodeSummary(prompt);
        } catch (Exception e) {
            log.error("生成图表说明失败", e);
            return "该图展示了系统的相关设计内容。";
        }
    }

    /**
     * 构建图表说明提示词
     */
    private String buildDiagramDescriptionPrompt(
            String diagramType,
            String context,
            DetailedAnalysisReportEntity report) {
        
        String diagramTypeName = getDiagramTypeName(diagramType);
        
        return String.format("""
                请为毕业论文中的%s生成专业的说明文字。
                
                ## 图表类型
                %s
                
                ## 上下文
                %s
                
                ## 项目信息
                %s
                
                ## 要求
                1. 说明文字要专业、学术化
                2. 要说明图表展示的主要内容
                3. 要指出图表的重要性和意义
                4. 字数控制在100-200字
                5. 语言要流畅自然
                
                请直接输出说明文字，不要额外说明。
                """,
                diagramTypeName,
                diagramType,
                truncate(context, 500),
                truncate(report.getProjectOverview(), 300)
        );
    }

    /**
     * 获取图表类型中文名称
     */
    private String getDiagramTypeName(String diagramType) {
        return switch (diagramType) {
            case "classDiagram" -> "类图";
            case "packageDependency" -> "包依赖图";
            case "sequenceDiagram" -> "时序图";
            case "layerArchitecture" -> "分层架构图";
            case "componentInteraction" -> "组件交互图";
            case "moduleRelation" -> "模块关系图";
            case "businessFlow" -> "业务流程图";
            case "stateMachine" -> "状态机图";
            case "designPatterns" -> "设计模式图";
            case "deploymentArchitecture" -> "部署架构图";
            case "monitoringArchitecture" -> "监控架构图";
            case "erDiagram" -> "ER图";
            case "tableStructure" -> "表结构图";
            default -> "系统图";
        };
    }

    /**
     * 批量生成所有图表的说明文字
     *
     * @param availableDiagrams 可用图表
     * @param analysisReport 分析报告
     * @return 图表类型 -> 说明文字的映射
     */
    public Map<String, String> generateAllDiagramDescriptions(
            Map<String, String> availableDiagrams,
            DetailedAnalysisReportEntity analysisReport) {
        
        log.info("批量生成图表说明，共 {} 个图表", availableDiagrams.size());

        Map<String, String> descriptions = new HashMap<>();

        for (Map.Entry<String, String> entry : availableDiagrams.entrySet()) {
            String diagramType = entry.getKey();
            String diagramPath = entry.getValue();
            
            String description = generateDiagramDescription(
                    diagramType, 
                    diagramPath, 
                    "", 
                    analysisReport
            );
            
            descriptions.put(diagramType, description);
        }

        log.info("图表说明生成完成");
        return descriptions;
    }
}

